package br.uvv.sao.managedBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.model.SelectItem;

import org.primefaces.event.UnselectEvent;

import br.uvv.sao.domain.Aluno;
import br.uvv.sao.domain.AlunoOferta;
import br.uvv.sao.domain.Disciplina;
import br.uvv.sao.domain.OfertaDisciplina;
import br.uvv.sao.domain.Professor;
import br.uvv.sao.enums.SituOfertaDisciplina;
import br.uvv.sao.rn.OfertaDisciplinaRN;
import br.uvv.sao.util.MsgUtil;

/***
 * Colocações gerais
 *  -> Quando eu adiciono um aluno na lista, ele deve sair da minha lista principal, de adição de alunos.
 *  -> Adicionar múltiplo, e caso n, apenas n limpar a lista do filtro.
 *  -> 
 * @author hermann
 *
 */
public class OfertaDisciplinaBean implements Serializable{

	private static final long serialVersionUID = -8390845894393724251L;
	
	private OfertaDisciplinaRN ofertaRN = new OfertaDisciplinaRN();
	
	private OfertaDisciplina ofertaInstance;
	private OfertaDisciplina ofertaInstanceTemp;
	private ArrayList<OfertaDisciplina> ofertaList;
	
	private ArrayList<AlunoOferta> alunoOfertaList;
	private AlunoOferta alunoOfertaInstance;
	
	//Prompt Busca Oferta Disciplina
	private ArrayList<Disciplina> disciplinaList;
	private Long idDisciplina;
	private ArrayList<Professor> professorList;
	private Long idProfessor;
	private String buscaSemestre;
	private String buscaAno;
	private List<SelectItem> anosList;
	
	//Prompt Busca Aluno
	private String buscaAlunoCodigo;
	private String buscaAlunoNome;
	private ArrayList<Aluno> alunoList;
	private Aluno alunoInstance;
	
	//Prompt Busca Disciplina
	private String buscaDisciplinaNome;
	private String buscaDisciplinaCodigo;
	private Disciplina disciplinaInstance;
	
	private String buscaProfessorNome;
	private String buscaProfessorCodigo;
	private Professor professorInstance;

	@PostConstruct
	private void init(){
		ofertaInstance = ofertaInstanceTemp = new OfertaDisciplina();
		alunoOfertaList = new ArrayList<AlunoOferta>();
		alunoOfertaInstance = new AlunoOferta();
		ofertaList = new ArrayList<OfertaDisciplina>();
		alunoInstance = new Aluno();
		alunoList = new ArrayList<Aluno>();
		disciplinaList = (ArrayList<Disciplina>) ofertaRN.listarDisciplina();
		professorList = (ArrayList<Professor>) ofertaRN.listarProfessor();
	}
	
	public String ofertaDisciplina(){
		init();
		return "goOfertasDisciplina";
	}
	
	public String goHome(){
		ofertaInstance = null;
		ofertaInstanceTemp = null;
		alunoOfertaList = null;
		ofertaList = null;
		alunoInstance = null;
		alunoList = null;
		disciplinaList = null;
		professorList = null;
		return "goHome";
	}
	
	public String goCreate(){
		disciplinaList = new ArrayList<Disciplina>();
		ofertaInstance = new OfertaDisciplina();
		disciplinaInstance = new Disciplina();
		professorInstance = new Professor();
		alunoInstance = new Aluno();
		alunoList = new ArrayList<Aluno>();
		professorList = new ArrayList<Professor>();
		alunoOfertaList = new ArrayList<AlunoOferta>();
		return "goCreate";
	}

	public String desistir(){
		init();
		return "goShow";
	}
	
	public String goEdit(){
		if (ofertaInstance != null && ofertaInstance.getId() > 0)
			ofertaInstanceTemp = ofertaInstance;
		return "goEdit";
	}
	
	public String desistirEdit(){
		try {
			if (ofertaInstanceTemp != null && ofertaInstanceTemp.getId()>0)
				ofertaInstance = ofertaInstanceTemp;
		} catch (NullPointerException e){
			ofertaInstance = new OfertaDisciplina();
		}
		ofertaInstanceTemp = new OfertaDisciplina();
		return "goShow";
	}
	
	public String finalizar(){
		return null;
	}
	
	public String salvar(){
		try {
			if (validacaoManualRequired()){
				ofertaInstance.setSituacao(SituOfertaDisciplina.Ofertada);
				ofertaInstance.setAlunosMatriculados(alunoOfertaList);
				ofertaInstance.setVersion(0);
				ofertaRN.salvar(ofertaInstance);
				MsgUtil.msgInfo("A oferta de disciplina foi criada com sucesso!");
				return "goShow";
			} else {
				return null;
			}
		} catch (Exception e){
			MsgUtil.msgError("Ocorreu um erro ao criar a oferta de disciplina!");
			return null;
		}
	}
	
	public void excluir(){
		try {
			ofertaRN.excluir(ofertaInstance);
			MsgUtil.msgInfo("A oferta de disciplina foi excluída com sucesso!");
		} catch (Exception e){
			MsgUtil.msgError("Ocorreu um erro ao criar a excluir a oferta de disciplina!");
		}
	}

	public void filtrarProfessor(){
		professorList = (ArrayList<Professor>) ofertaRN.listarProfessor(buscaProfessorCodigo, buscaProfessorNome);
	}
	
	public String selecionarProfessor(){
		Long id = professorInstance.getId();
		if (id!=null){
			ofertaInstance.setProfessor(professorInstance);
			professorInstance = new Professor();
			professorList = new ArrayList<Professor>();
		} else {
			MsgUtil.msgInfo("Nenhum professor selecionado!");
		}
		return null;
	}
	
	public void filtrarDisciplina(){
		disciplinaList = (ArrayList<Disciplina>) ofertaRN.listarDisciplina(buscaDisciplinaCodigo, buscaDisciplinaNome);
	}

	public String selecionarDisciplina(){
		Long id = disciplinaInstance.getId();
		if (id!=null){
			ofertaInstance.setDisciplina(disciplinaInstance);
			disciplinaInstance = new Disciplina();
			disciplinaList = new ArrayList<Disciplina>();
		} else {
			MsgUtil.msgInfo("Nenhuma disciplina selecionada!");
		}
		return null;
	}
	
	public void filtrarAluno(){
		alunoList = (ArrayList<Aluno>) ofertaRN.listarAluno(buscaAlunoCodigo, buscaAlunoNome, alunoOfertaList);
	}

	public void adicionarAluno(){
		if (alunoInstance != null){
			alunoOfertaInstance = new AlunoOferta();
			alunoOfertaInstance.setAluno(alunoInstance);
			alunoOfertaInstance.setOfertaDisciplina(ofertaInstance);
			alunoOfertaList.add(alunoOfertaInstance);
			MsgUtil.msgInfo("Aluno '" + alunoInstance.getNomeCompleto() + "' adicionado com sucesso!");
			alunoInstance = new Aluno();
			alunoOfertaInstance = new AlunoOferta();
		} else {
			MsgUtil.msgInfo("Nenhum aluno foi adicionado!");
		}
	}

	public void removerAluno(){
		alunoOfertaList.remove(alunoOfertaInstance);
	}
	
	public void filtrarOfertaDisciplina(){
		ofertaList = ofertaRN.listarOferta(idDisciplina, idProfessor, buscaSemestre, null);
	}
	
	public String selecionarOfertaDisciplina(){
		Long id = ofertaInstanceTemp.getId();
		if (id!=null){
			ofertaInstance = ofertaInstanceTemp;
			ofertaInstanceTemp = new OfertaDisciplina();
			ofertaList = new ArrayList<OfertaDisciplina>();
			alunoOfertaList = ofertaRN.getAlunoOfertaList(ofertaInstance.getId());
			if (alunoOfertaList == null)
				alunoOfertaList = new ArrayList<AlunoOferta>();
		} else {
			MsgUtil.msgInfo("Nenhuma oferta selecionada!");
		}
		return null;
	}
	
	public Boolean validacaoManualRequired(){
		Boolean flag = true;
		if (ofertaInstance.getDisciplina().getId() == null){
			MsgUtil.msgError("O campo 'Disciplina' é obrigatório!");
			flag = false;
		}
		if (ofertaInstance.getProfessor().getId() == null){
			MsgUtil.msgError("O campo 'Professor' é obrigatório!");
			flag = false;
		}
		return flag;
	}
	
	public void onRowUnselectEvent(UnselectEvent event){
		alunoInstance = null;
	}
	
	public OfertaDisciplina getOfertaInstance() {
		return ofertaInstance;
	}
	public void setOfertaInstance(OfertaDisciplina ofertaInstance) {
		this.ofertaInstance = ofertaInstance;
	}
	public OfertaDisciplina getOfertaInstanceTemp() {
		return ofertaInstanceTemp;
	}
	public void setOfertaInstanceTemp(OfertaDisciplina ofertaInstanceTemp) {
		this.ofertaInstanceTemp = ofertaInstanceTemp;
	}
	public ArrayList<OfertaDisciplina> getOfertaList() {
		return ofertaList;
	}
	public void setOfertaList(ArrayList<OfertaDisciplina> ofertaList) {
		this.ofertaList = ofertaList;
	}
	public ArrayList<Aluno> getAlunoList() {
		return alunoList;
	}
	public void setAlunoList(ArrayList<Aluno> alunoList) {
		this.alunoList = alunoList;
	}
	public Aluno getAlunoInstance() {
		return alunoInstance;
	}
	public void setAlunoInstance(Aluno alunoInstance) {
		this.alunoInstance = alunoInstance;
	}
	public ArrayList<Disciplina> getDisciplinaList() {
		return disciplinaList;
	}
	public void setDisciplinaList(ArrayList<Disciplina> disciplinaList) {
		this.disciplinaList = disciplinaList;
	}
	public String getBuscaAlunoCodigo() {
		return buscaAlunoCodigo;
	}
	public void setBuscaAlunoCodigo(String buscaAlunoCodigo) {
		this.buscaAlunoCodigo = buscaAlunoCodigo;
	}
	public String getBuscaAlunoNome() {
		return buscaAlunoNome;
	}
	public void setBuscaAlunoNome(String buscaAlunoNome) {
		this.buscaAlunoNome = buscaAlunoNome;
	}
	public Long getIdDisciplina() {
		return idDisciplina;
	}
	public void setIdDisciplina(Long idDisciplina) {
		this.idDisciplina = idDisciplina;
	}
	public Long getIdProfessor() {
		return idProfessor;
	}
	public void setIdProfessor(Long idProfessor) {
		this.idProfessor = idProfessor;
	}
	public ArrayList<Professor> getProfessorList() {
		return professorList;
	}
	public void setProfessorList(ArrayList<Professor> professorList) {
		this.professorList = professorList;
	}
	public String getBuscaSemestre() {
		return buscaSemestre;
	}
	public void setBuscaSemestre(String buscaSemestre) {
		this.buscaSemestre = buscaSemestre;
	}
	public String getBuscaAno() {
		return buscaAno;
	}
	public void setBuscaAno(String buscaAno) {
		this.buscaAno = buscaAno;
	}
	public String getBuscaDisciplinaNome() {
		return buscaDisciplinaNome;
	}
	public void setBuscaDisciplinaNome(String buscaDisciplinaNome) {
		this.buscaDisciplinaNome = buscaDisciplinaNome;
	}
	public String getBuscaDisciplinaCodigo() {
		return buscaDisciplinaCodigo;
	}
	public void setBuscaDisciplinaCodigo(String buscaDisciplinaCodigo) {
		this.buscaDisciplinaCodigo = buscaDisciplinaCodigo;
	}
	public Disciplina getDisciplinaInstance() {
		return disciplinaInstance;
	}
	public void setDisciplinaInstance(Disciplina disciplinaInstance) {
		this.disciplinaInstance = disciplinaInstance;
	}
	public String getBuscaProfessorNome() {
		return buscaProfessorNome;
	}
	public void setBuscaProfessorNome(String buscaProfessorNome) {
		this.buscaProfessorNome = buscaProfessorNome;
	}
	public String getBuscaProfessorCodigo() {
		return buscaProfessorCodigo;
	}
	public void setBuscaProfessorCodigo(String buscaProfessorCodigo) {
		this.buscaProfessorCodigo = buscaProfessorCodigo;
	}
	public Professor getProfessorInstance() {
		return professorInstance;
	}
	public void setProfessorInstance(Professor professorInstance) {
		this.professorInstance = professorInstance;
	}
	public List<SelectItem> getAnosList() {
		anosList = new ArrayList<SelectItem>();
		for (Integer i=2010; i<2025; i++){
			anosList.add(new SelectItem("02/02/"+i, i.toString()));
		}
		return anosList;
	}
	public void setAnosList(List<SelectItem> anosList) {
		this.anosList = anosList;
	}
	public AlunoOferta getAlunoOfertaInstance() {
		return alunoOfertaInstance;
	}
	public ArrayList<AlunoOferta> getAlunoOfertaList() {
		return alunoOfertaList;
	}
	public void setAlunoOfertaInstance(AlunoOferta alunoOfertaInstance) {
		this.alunoOfertaInstance = alunoOfertaInstance;
	}
	public void setAlunoOfertaList(ArrayList<AlunoOferta> alunoOfertaList) {
		this.alunoOfertaList = alunoOfertaList;
	}
}